#!/usr/bin/env python3
# -*- coding: utf-8 -*-

"""
管理员账号初始化脚本
用于独立创建或重置管理员账号
"""

import os
import sys
from pymongo import MongoClient
from pymongo.errors import ConnectionFailure
from bson.objectid import ObjectId
from datetime import datetime
import bcrypt
import argparse
from dotenv import load_dotenv

# 加载环境变量
load_dotenv()

def hash_password(password):
    """使用bcrypt加密密码"""
    return bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')

def init_admin_account(username='admin', password='12345678', role='super_admin'):
    """初始化管理员账号"""
    
    # MongoDB连接配置
    MONGO_URI = os.getenv('MONGO_URI', "mongodb://localhost:27017/")
    DB_NAME = os.getenv('DB_NAME', "student_management")
    ADMIN_USERS_COLLECTION = os.getenv('ADMIN_USERS_COLLECTION', "admin_users")
    
    try:
        # 连接到MongoDB
        client = MongoClient(MONGO_URI)
        db = client[DB_NAME]
        collection = db[ADMIN_USERS_COLLECTION]
        
        print(f"连接到数据库: {DB_NAME}")
        print(f"使用集合: {ADMIN_USERS_COLLECTION}")
        
        # 检查是否已存在管理员账号
        existing_admin = collection.find_one({'username': username})
        if existing_admin:
            print(f"管理员账号 '{username}' 已存在")
            print("是否要重置密码？(y/N): ", end='')
            choice = input().strip().lower()
            
            if choice == 'y':
                # 更新密码
                result = collection.update_one(
                    {'_id': existing_admin['_id']},
                    {'$set': {
                        'password': hash_password(password),
                        'updated_at': datetime.now()
                    }}
                )
                if result.modified_count > 0:
                    print(f"✅ 管理员 '{username}' 密码已重置")
                    print(f"新密码: {password}")
                else:
                    print("❌ 密码重置失败")
            else:
                print("操作取消")
            return
        
        # 创建管理员数据
        admin_data = {
            'username': username,
            'password': hash_password(password),
            'role': role,
            'created_at': datetime.now(),
            'updated_at': datetime.now(),
            'last_login': None
        }
        
        # 插入数据库
        result = collection.insert_one(admin_data)
        
        print("✅ 管理员账号创建成功!")
        print(f"用户名: {username}")
        print(f"密码: {password}")
        print(f"角色: {role}")
        print(f"账号ID: {result.inserted_id}")
        
    except ConnectionFailure as e:
        print(f"❌ MongoDB连接失败: {e}")
        sys.exit(1)
    except Exception as e:
        print(f"❌ 初始化管理员账号失败: {str(e)}")
        sys.exit(1)

def main():
    """主函数"""
    parser = argparse.ArgumentParser(description='初始化管理员账号')
    parser.add_argument('--username', '-u', default='admin', help='管理员用户名 (默认: admin)')
    parser.add_argument('--password', '-p', default='12345678', help='管理员密码 (默认: 12345678)')
    parser.add_argument('--role', '-r', default='super_admin', help='管理员角色 (默认: super_admin)')
    
    args = parser.parse_args()
    
    print("=" * 50)
    print("管理员账号初始化工具")
    print("=" * 50)
    
    print(f"用户名: {args.username}")
    print(f"密码: {args.password}")
    print(f"角色: {args.role}")
    print("-" * 50)
    
    # 确认操作
    print("确认创建管理员账号？(y/N): ", end='')
    choice = input().strip().lower()
    
    if choice == 'y':
        init_admin_account(args.username, args.password, args.role)
    else:
        print("操作取消")
    
    print("=" * 50)

if __name__ == '__main__':
    main()
